package cmd

import (
	"fmt"
	"log"
	"os/exec"
	"strings"
)

// ExecuCmdQuietly 静谧执行命令
func ExecuCmdQuietly(cmdStr string, args ...string) {
	command := exec.Command(cmdStr, args...)
	log.Printf("执行命令: %s\n", cmdStr+" "+strings.Join(args, " "))
	// 运行命令
	// Start 打开目录不能展示出来，而是在任务栏闪烁
	_, _ = command.CombinedOutput()
}

// ExecuCmd 执行命令-输出结果
func ExecuCmd(cmdStr string, args ...string) (strings.Builder, error) {
	command := exec.Command(cmdStr, args...)
	log.Printf("执行命令: %s\n", cmdStr+" "+strings.Join(args, " "))
	return execuCmd(command)
}

// ExecuCmdWithTargetDir 切换到指定目录并执行命令
func ExecuCmdWithTargetDir(dir string, cmdStr string, args ...string) (strings.Builder, error) {
	command := exec.Command(cmdStr, args...)
	command.Dir = dir
	log.Printf("切换目录: %s, 执行命令: %s\n", dir, cmdStr+" "+strings.Join(args, " "))
	return execuCmd(command)
}

func execuCmd(command *exec.Cmd) (strings.Builder, error) {

	// 获取命令的输出
	var out strings.Builder
	// 运行命令
	output, err := command.CombinedOutput()
	if err != nil {
		return out, fmt.Errorf("cmd.CombinedOutput failed with %s -- %s\n", err, string(output))
	}

	_, err = out.Write(output)
	if err != nil {
		return out, fmt.Errorf("out.Write failed with %s\n", err)
	}

	return out, nil
}

// 切换执行命令的目录并执行命令
// func changeDirCmd(dir string, cmdStr string, args ...string) strings.Builder {
//	command := exec.Command(cmdStr, args...)
//	command.Dir = dir
//
//	log.Printf("切换目录: %s, 执行命令: %s\n", dir, cmdStr+" "+strings.Join(args, " "))
//	out := ExecuCmd(command, args...)
//
//	return out
// }

// 执行命令-输出结果
// func execCmd(command *exec.Cmd) strings.Builder {
//	// 获取命令的输出
//	var out strings.Builder
//	// 运行命令
//	output, err := command.CombinedOutput()
//	if err != nil {
//		// 获取报错信息
//		_, err2 := out.Write(output)
//		if err2 != nil {
//			panic(fmt.Errorf("执行命令 %s 获取输出结果出错! %v", command.String(), err2.Error()))
//		}
//		panic(fmt.Errorf("执行命令 %s 出错! %s %v",
//			command.String(),
//			out.String(),
//			err.Error()))
//	}
//
//	_, err = out.Write(output)
//	if err != nil {
//		panic(fmt.Errorf("执行命令 %s 获取输出结果出错! %v", command.String(), err.Error()))
//	}
//	return out
// }
